import { Loading , MessageBox  } from 'element-ui'
import {
  checkTokenApi,
  refreshTokenApi,
  logoutApi,
  getTokenApi,
  getUseLoginByUsernameApi,
  getMenusApi,
} from '@/api/idaas'
import { AppInfo } from '@/config/idaas'
import store from '@/store'
import router from '@/router/index'
import { foreachTreeData } from '@/utils/tree'
import {getToken, setToken, removeToken, removeJSESSIONID} from '@/utils/auth'
// import eamRoutes from '@/router/eamRoutes'

let loadingInstance= null

/**
* 检查登录状态
*/
// export async function checkLoginState() {
//   const token = fetchToken() // token通常从浏览器Cookie中获取
//   const check = await checkToken(token)
//   if (!check) {
//     removeToken()// 清理Cookie中的token信息
//     redirctLoginPage()
//   }
// }

/**
* 重定向至单点登录系统的登录页面
* @param {*} params 【非必需】应用的附带信息,用户登录后会原样返回
*/
// export function redirctLoginPage(params = '') {
//   loadingInstance = Loading.service({
//     lock: true,
//     text: '登陆中...',
//     background: 'rgba(255,255,255)',
//   })

//   const { href } = window.location

//   const accessTokenCache = getToken()
//   if (accessTokenCache) {
//     // 当前有缓存token
//     getUseLoginByUsernameApi().then((res) => {
//       if (res?.code === 200 && res?.user) {
//         store.commit('user/setUserInfo', res?.user)
//         store.commit('user/setPermissions', res?.permissions)
//       }
//     }).finally(() => {
//       clearLoadingTimeout()
//     })
//     getMenusApi().then((res) => {
//       if (res?.code !== 200) {
//         return
//       }
//       if (res?.data?.length) {
//         addRouter(res?.data)
//       } else {
//         showTips('当前用户没有菜单权限！', () => {
//           clearLoadingTimeout()
//           logout()
//         })
//       }
//     })
//   } else {
//     let code = ''
//     const _code = href.match(/(?<=\?code=)\w+/g)
//     if (_code?.length) {
//       code = _code[0]
//     }
//     if (code) {
//       getTokenApi(code).then((res) => {
//         if (res?.code === 200) {
//           const { token } = res
//           setToken(`${ token }`)
//           // router.replace({ path: '/home' })
//           redirctLoginPage()
//         } else {
//           showTips('登陆失败！', () => {
//             logout()
//           })
//         }
//       }).catch(() => {
//         showTips('登陆失败！', () => {
//           logout()
//         })
//       })
//     } else {
//       goLoginPage(params)
//     }
//   }
// }

// 获取url上的code
export function getCode(url = location.href){
  let code = ''
  const _code = url.match(/(?<=\?code=)\w+/g)
  if (_code?.length) {
    code = _code[0]
  }
  return code
}

export function getApiToken(code){
  return new Promise((resolve,reject)=>{
    return getTokenApi(code).then((res) => {
      if (res?.code === 200) {
        const { token } = res
        setToken(`${ token }`)
        resolve()
      } else {
        // showTips('登陆失败！', () => {
        //   logout()
        // })
        reject()
      }
    }).catch(() => {
      // showTips('登陆失败！', () => {
      //   logout()
      // })
      reject()
    })
  })
}

/**
* 重定向至单点登录系统的登录页面
* @param {*} params 【非必需】应用的附带信息,用户登录后会原样返回
*/
export function goLoginPage(params='') {
  // eslint-disable-next-line max-len
  const url = `${ AppInfo.SSO }/oauth/authorize?response_type=code&client_id=${ AppInfo.clientId }&redirect_uri=${ encodeURIComponent(AppInfo.redirectUrl) }&state=${ params || '' }`
  window.location.href = url
}

/**
* tonken校验
* 如果校验成功，返回true,否则返回false
*/
export function checkToken(token) {
  if(!token){
    return false
  }
  return checkTokenApi(token).then((res) => {
    if (res.code === 200) {
      // 如果token剩余有限期为10s,可以通过RefreshToken刷新Token
      if (res.results.exp < 10000) {
        refreshToken()
      }
      return true
    }
    return false
  })
}

/**
* 刷新Token
* 调用应用后台接口进行Token刷新。这里是伪代码
*/
export function refreshToken() {
  const accessTokenCache = getToken()

  refreshTokenApi(accessTokenCache).then((res) => {
    const { token } = res

    setToken(`${ token }`)
  })
}

/**
* 登出
*/
export function logout() {
  logoutApi().then((res) => {
    if (res.code === 200) {
      removeToken()
      removeJSESSIONID()
      window.location.href = AppInfo.myApps
    }
  })
}

/**
* 获取Token
* @param {*} token
*/
export function fetchToken() {
  return getToken()
}

/**
 * 添加动态路由
 * @param data 
 */
// export function addRouter(data) {
//   const _data = JSON.parse(JSON.stringify(data))
//   const routes = []
//   let menuTree= []
//   const eamRoutes = []

//   foreachTreeData(_data, (r) => {
//     const componentUrl = r.component
//     if (eamRoutes[componentUrl]) {
//       r.component = eamRoutes[componentUrl]
//       if (!/^\//.test(r.path)) {
//         r.path = `/${ r.path }`
//       }
//       if (!r?.children?.length) {
//         routes.push(r)
//       }
//     }
//   })

//   menuTree = _data

//   router.addRoute({
//     path: '/eam',
//     name: 'EAM',
//     component: () => import('@/views/index.vue'),
//     children: routes,
//   })

//   store.commit('routeData/setMenuTree', menuTree)

//   router.replace({ path: '/home' })
//   const timer = setTimeout(() => {
//     clearLoadingTimeout()
//     clearTimeout(timer)
//   }, 500)
// }

export function clearLoadingTimeout() {
  if (!loadingInstance) {
    return
  }
  const timer = setTimeout(() => {
    clearTimeout(timer)
    loadingInstance?.close()
    loadingInstance = null
  }, 500)
}

export function showTips(text, cb) {
  MessageBox.alert(text, '提示', {
    confirmButtonText: '确定',
    callback: () => {
      cb && cb()
    },
  })
}